package com.warom.sdg.service;

import android.app.Application;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.warom.sdg.model.ApiResponse;
import com.warom.sdg.model.VentilationConfigEntity;
import com.warom.sdg.repository.VentilationConfigRepository;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class VentilationConfigService {

    private VentilationConfigRepository mRepository;
    private Gson gson = new Gson();

    public VentilationConfigService(Application application) {
        mRepository = new VentilationConfigRepository(application);
    }

    /**
     * 获取通风配置，并转换为Map格式
     * @return 以deviceType为键的配置Map
     */
    public Map<String, VentilationConfigEntity> getVentilationConfigs() {
        List<VentilationConfigEntity> configList = mRepository.getAllConfigs();
        Map<String, VentilationConfigEntity> configMap = new HashMap<>();
        if (configList != null) {
            for (VentilationConfigEntity entity : configList) {
                configMap.put(entity.getDeviceType(), entity);
            }
        }
        // 如果数据库为空，可以在这里插入默认值
        if (configMap.isEmpty()) {
            return createAndPersistDefaultConfigs();
        }
        return configMap;
    }

    /**
     * 获取通风配置列表
     * @return 通风配置列表的API响应
     */
    public ApiResponse<List<VentilationConfigEntity>> getVentilationConfigList() {
        try {
            List<VentilationConfigEntity> configList = mRepository.getAllConfigs();
            
            // 如果数据库为空，创建默认配置
            if (configList == null || configList.isEmpty()) {
                Map<String, VentilationConfigEntity> defaultConfigs = createAndPersistDefaultConfigs();
                configList = mRepository.getAllConfigs(); // 重新获取，包括新创建的默认配置
            }
            
            return ApiResponse.success(configList);
        } catch (Exception e) {
            return ApiResponse.error("获取通风配置列表失败: " + e.getMessage());
        }
    }

    /**
     * 更新单条通风配置
     * @param config 要更新的配置实体
     * @return 更新后的配置实体的API响应
     */
    public ApiResponse<VentilationConfigEntity> updateVentilationConfig(VentilationConfigEntity config) {
        try {
            if (config == null || config.getDeviceType() == null) {
                return ApiResponse.error("无效的配置数据");
            }
            
            mRepository.saveConfig(config);
            return ApiResponse.success(config);
        } catch (Exception e) {
            return ApiResponse.error("更新通风配置失败: " + e.getMessage());
        }
    }

    /**
     * 保存从JS接收的JSON配置
     * @param jsonConfig JSON字符串
     */
    public void saveVentilationConfig(String jsonConfig) {
        Type type = new TypeToken<Map<String, VentilationConfigEntity>>(){}.getType();
        Map<String, VentilationConfigEntity> configMap = gson.fromJson(jsonConfig, type);

        for (Map.Entry<String, VentilationConfigEntity> entry : configMap.entrySet()) {
            VentilationConfigEntity entity = entry.getValue();
            entity.setDeviceType(entry.getKey()); // 确保deviceType已设置
            mRepository.saveConfig(entity);
        }
    }
    
    /**
     * 创建并持久化默认配置
     * @return 默认配置的Map
     */
    private Map<String, VentilationConfigEntity> createAndPersistDefaultConfigs() {
        Map<String, VentilationConfigEntity> defaultConfigMap = new HashMap<>();
        
        String[] deviceTypes = {"NATURAL_WINDOW", "AXIAL_FAN", "CIRCULATION_FAN"};

        for (String deviceType : deviceTypes) {
            VentilationConfigEntity defaultConfig = new VentilationConfigEntity();
            defaultConfig.setDeviceType(deviceType);
            defaultConfig.setTargetTemperature(25);
            defaultConfig.setTargetHumidity(60);
            defaultConfig.setStartTime("08:00");
            defaultConfig.setEndTime("18:00");
            defaultConfig.setDuration(30);
            
            // 保存到数据库
            mRepository.saveConfig(defaultConfig);
            defaultConfigMap.put(deviceType, defaultConfig);
        }
        
        return defaultConfigMap;
    }
} 